home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_1 / airfoil < prev    next >
Text File  |  1995-03-31  |  11KB  |  273 lines

  1. Article 2073 of comp.sys.handhelds:
  2. Path: en.ecn.purdue.edu!noose.ecn.purdue.edu!mentor.cc.purdue.edu!purdue!bu.edu!rpi!zaphod.mps.ohio-state.edu!usc!orion.oac.uci.edu!!nelson
  3. From: nelson@ (Matt Nelson)
  4. Newsgroups: comp.sys.handhelds
  5. Subject: Airfoil Plotter for HP48sx
  6. Summary: draws airfoils of arbitrary size
  7. Keywords: graphics, airfoil
  8. Message-ID: <272CBB0E.21490@orion.oac.uci.edu>
  9. Date: 29 Oct 90 23:28:14 GMT
  10. Reply-To: nelson@psroot.ps.uci.edu
  11. Organization: University of California, Irvine
  12. Lines: 257
  13.  
  14.  
  15.      This is for all of the R/C model airplane/sailplane enthusiasts out there,
  16. especially if you are into designing and building. If you have no interest in
  17. model aircraft, you might as well hit 'n' now.
  18.  
  19.      Here is the latest version of my airfoil section plotter.  I needed to
  20. plot  some ribs for a glider project, and realized that I had sold my trusty 
  21. HP-28s.  I quickly re-wrote my original program to run on the HP-48sx,  and
  22. came up with something MUCH prettier, and MUCH MUCH faster.  This  thing is
  23. really quite painless to use now (the 28s version was slooooow).
  24.  
  25.      The speedup came from creating a PICT that is big enough to contain  the
  26. entire airfoil section.  The airfoil data is plotted only once, and then sent
  27. to the printer, one screen at a time, through successive PVIEW and PRLCD
  28. commands.  BE WARNED... although this is a very fast way to print out large
  29. objects, it is also a memory-hungry way to do it. for example, a 10" SD7003
  30. required a PICT that was 131 by 832.  When I saved this PICT to the stack and
  31. BYTESed it, it was 14,154 bytes big.  On top of that, just the data for the
  32. SD7003 (as listed below) is 988.5 bytes long.  All I am saying is that this
  33. program DOES use a lot of memory, but is very handy, and serves my purposes
  34. very well; if you don't like it, feel free to use something else.
  35.  
  36.      To use this program, simply download the listing below, get into the new
  37. directory, and hit [AIRFOI].  It will ask for an airfoil.  Just hit the menu
  38. button corresponding to the airfoil data you wish to use  (you can hit [SD700]
  39. to try it out), then [ENTER].  It will then ask for  a chord.  Give it a number
  40. corresponding to the desired chord, in centimeters, then [ENTER].  The program
  41. will handle other units, and in fact presents you with the UNITS LENG menu, so
  42. you can give it a chord size in any unit you wish.  Just be sure to give it a
  43. valid unit object (you have to supply the underscore manually, since the
  44. calculator is in program entry mode at this point).  You should be greeted by a
  45. "working..." message.  Point the calculator at your 82240A/B printer, and watch
  46. the airfoil section print out.
  47.  
  48.      The airfoil data is assumed to be in a complex vector, where each element
  49. corresponds to a point (x,y) on the airfoil.  The points should be arranged so
  50. that if you were to draw lines sequentially from one point to the next,  you
  51. would trace out a closed outline of the airfoil section.  The sample airfoil in
  52. this posting, the SD7003, should help illustrate this.  For those who are
  53. interested, the SD7003 is an airfoil designed specifically for use at very low
  54. Reynolds numbers, such as those encountered by model sailplanes.
  55.  
  56.      There are two parameters which control the absolute size of the printed
  57. output.  These are the global variables ycmps and xcmps.  These represent the
  58. number of centimeters per screen OF PRINTED OUTPUT for the y and x directions,
  59. respectfully.  One arrives at these values by printing a screenfull of
  60. anything, and measuring the size of the printed output in centimeters.  The
  61. numbers supplied below are for the 82240A printer; I have never used a 'B'
  62. version of the printer, and don't know whether these numbers will have to be
  63. changed in order to work properly with that printer.  The only reason I left
  64. these numbers as global variables is so that the user could have some control
  65. over the aspect ratio of the output, without diving into the program itself.
  66.  
  67.      Please direct any comments/suggestions/questions etc. to:
  68.  
  69.      Matt Nelson             internet:  nelson@psroot.ps.uci.edu
  70.      Physics Dept.        bitnet:    mnelson@uci
  71.      University of California   phone:     (714) 725-2629
  72.      Irvine, CA 92717
  73.  
  74. ---snip----snip----snip----snip----snip----snip----snip----snip----snip----snip
  75.  
  76. %%HP: T(3)A(R)F(.);
  77. DIR
  78.                                                     
  79. AIRFOIL                                                                  
  80. \<<  
  81.   "Airfoil?"            @ prompt for airfoil name
  82.   {1}
  83.   INPUT
  84.   OBJ\->            @ get the data array on the stack
  85.   DUP IF TYPE 4 \=/ THEN    @ check to see if this is a complex
  86.     "Not airfoil data"        @ array; assumes any complex array
  87.     DOERR            @ in this directory IS airfoil data
  88.     DROP
  89.     KILL            @ if not, kill the program
  90.   END
  91.   43 MENU            @ select UNITS LENG menu
  92.   "Chord?"            @ prompt for desired chord             
  93.   {1}
  94.   INPUT
  95.   OBJ\->            @ put chord on stack
  96.   0 MENU            @ return to previous menu
  97.   CLLCD
  98.   "   working..." 3 DISP    @ display info message
  99.   DUP                @ get type of argument 
  100.   IF TYPE 13 == THEN        @ it is a unit object 
  101.     '1_cm' CONVERT        @ assume unit is length, so convert to cm 
  102.     OBJ\-> DROP            @ get rid of its unit
  103.   END
  104.   PPAR                @ get current PPAR so we can save it
  105.   \-> chord ppar        @ save desired chord, in cm, and PPAR
  106.   \<<
  107.     # 64d            @ eventual width of PICT we will want 
  108.     chord ycmps /        @ required height of PICT, in screens
  109.     CEIL            @ required height of PICT, in integer screens
  110.     \-> nscreen            @ we will need number of screens later 
  111.     \<<  {
  112.       (-1.82,0) (1.82,2.11)    @ put a PPAR on stack, so that we have
  113.       X 0 (0,0) FUNCTION Y }    @ something to work with...
  114.       1                @ PUT index for pmin
  115.       xcmps 2 / NEG        @ get xmin from the real width of output
  116.       0 R\->C PUT        @ put (xmin,0) into our PPAR
  117.       2                @ PUT index for below...
  118.       xcmps 2 /            @ get xmax from the real width of output
  119.       nscreen ycmps *        @ new ymax = #screens * (cm/screen)
  120.       R\->C PUT            @ make it complex, and shove it into PPAR
  121.       'PPAR' STO        @ store it for use
  122.       nscreen 64 * R\->B PDIM    @ make PICT the appropriate size               
  123. @                                                 
  124. @ at this point, we still have the array of coordinates on the stack,
  125. @ so re-scale them into cm
  126. @
  127.       DUP SIZE OBJ\-> DROP    @ get size of array
  128.       -100 100 -100 100        @ initialize xmax=ymax=-100, xmin=ymin=100
  129.       \-> size xmax xmin ymax ymin
  130.       \<< 
  131.         1 1 size
  132.         START            @ scan the array looking for max & min x
  133.           GETI C\->R        @ get the x and y coord
  134.           \-> x y
  135.           \<<
  136.             x xmin MIN        @ put minimum of x and xmin in xmin
  137.             'xmin' STO
  138.             x xmax MAX        @ put maximum of x and xmax in xmax
  139.             'xmax' STO
  140.             y ymin MIN        @ put minimum of y and ymin in ymin
  141.             'ymin' STO
  142.             y ymax MAX        @ put maximum of y and ymax in ymax
  143.             'ymax' STO
  144.           \>>
  145.         NEXT                        
  146.         DROP            @ get rid of the GETI index
  147.         1 1 size 1 -
  148.         START DUP NEXT        @ make two arrays of 1's, size of data
  149.         size 1 \->LIST \->ARRY DUP       
  150.         ROT C\->R            @ get y-coordinates
  151.         4 ROLL ymax ymin + 2 / *    @ make array of average y value
  152.         -                @ shift y values by subtracting average
  153.         3 ROLLD SWAP xmin * -    @ subtract xmin from all x values
  154.         SWAP R\->C        @ re-pack complex array, now has [0,1] x-range
  155.         chord *            @ multiply by chord for proper scale
  156. @   
  157. @ we now have a properly scaled array of coordinates on the stack, so
  158. @ connect the dots between adjacent points
  159. @
  160.         ERASE            @ clear PICT
  161.         1 size 1 -        @ need one less than size of the array
  162.         FOR i
  163.           DUP i GETI
  164.           4 ROLLD GET ROT    @ put the first pair of points on the stack
  165.           C\->R SWAP R\->C    @ swap x and y so foil comes out long-wise
  166.           SWAP
  167.           C\->R SWAP R\->C    @ do same with 2nd point
  168.           LINE            @ draw a line between the two points
  169.         NEXT
  170.         DROP            @ don't need the array of points anymore
  171.       \>>
  172. @
  173. @ now PICT has the airfoil drawn on it, so display it screen
  174. @ by screen, dumping it to the printer
  175. @
  176.       CR            @ put print head over to right
  177.       1 nscreen            @ there will be nscreen dumps
  178.       FOR i
  179.         # 0d            @ upper left hand x-pixel coordinate to display
  180.         i 1 - 64 * R\->B    @ upper right hand y-pixel coordinate "
  181.         2 \->LIST        @ put pixel coordinates in a list
  182.         PVIEW            @ and display PICT
  183.         PRLCD            @ send display to printer
  184.       NEXT
  185.     \>>
  186. @
  187. @ we is done, so clean up
  188. @
  189.     ppar DUP                                                  
  190.     IF TYPE 6 == THEN        @ there was no PPAR, and we just saved a name
  191.       DROP            @ at top of program; just drop it
  192.       'PPAR' PURGE        @ and get rid of the one we created
  193.     ELSE
  194.       'PPAR' STO        @ there was a PPAR, so restore it
  195.     END
  196.     PICT PURGE            @ get back the memory used by PICT
  197.   \>>
  198. \>>
  199.  
  200.  
  201. ycmps                @ height of one screen of PRINTED OUTPUT, cm
  202.   2.096
  203.  
  204. xcmps                @ width of one screen of PRINTED OUTPUT, cm
  205.   3.60
  206.   
  207. SD7003                @ sample airfoil, the Selig-Donovan 7003
  208.   [ (1.00000,0.0)
  209.     (0.99681,0.00031)
  210.     (0.98745,0.00132)
  211.     (0.97235,0.00310)
  212.     (0.95193,0.00547)
  213.     (0.92639,0.00824)
  214.     (0.89600,0.01139)
  215.     (0.86112,0.01494)
  216.     (0.82224,0.01884)
  217.     (0.77985,0.02304)
  218.     (0.73449,0.02744)
  219.     (0.68673,0.03197)
  220.     (0.63717,0.03649)
  221.     (0.58641,0.04086)
  222.     (0.53499,0.04494)
  223.     (0.48350,0.04859)
  224.     (0.43249,0.05171)
  225.     (0.38250,0.05415)
  226.     (0.33405,0.05581)
  227.     (0.28760,0.05658)
  228.     (0.24358,0.05639)
  229.     (0.20240,0.05518)
  230.     (0.16442,0.05292)
  231.     (0.12993,0.04961)
  232.     (0.09921,0.04526)
  233.     (0.07244,0.03993)
  234.     (0.04978,0.03372)
  235.     (0.03130,0.02677)
  236.     (0.01702,0.01932)
  237.     (0.00697,0.01172)
  238.     (0.00127,0.00438)
  239.     (0.00025,-0.00186)
  240.     (0.00457,-0.00741)
  241.     (0.01408,-0.01285)
  242.     (0.02839,-0.01759)
  243.     (0.04763,-0.02141)
  244.     (0.07182,-0.02438)
  245.     (0.10073,-0.02660)
  246.     (0.13407,-0.02809)
  247.     (0.17150,-0.02888)
  248.     (0.21268,-0.02900)
  249.     (0.25719,-0.02852)
  250.     (0.30456,-0.02752)
  251.     (0.35426,-0.02608)
  252.     (0.40572,-0.02428)
  253.     (0.45837,-0.02217)
  254.     (0.51161,-0.01980)
  255.     (0.56484,-0.01723)
  256.     (0.61748,-0.01450)
  257.     (0.66898,-0.01167)
  258.     (0.71883,-0.00887)
  259.     (0.76644,-0.00628)
  260.     (0.81118,-0.00403)
  261.     (0.85241,-0.00220)
  262.     (0.88957,-0.00082)
  263.     (0.92210,0.00008)
  264.     (0.94952,0.00052)
  265.     (0.97134,0.00057)
  266.     (0.98718,0.00037)
  267.     (0.99679,0.00011)
  268.     (1.00001,-0.00000) ]                                           
  269.  
  270. END
  271.  
  272.  
  273.